<?php
class Arm_Controller_Action_Helper_Acl extends Zend_Controller_Action_Helper_Abstract
{
	/**
	 * Рестер Arm_Acl для модулей.
	 * @var array
	 */
	private static $_register = array();
	
	

   /**
     * Hook into action controller preDispatch() workflow
     *
     * @return void
     */
    public function preDispatch()
    {
        $request = $this->_actionController->getRequest();
    	$module  = $request->getModuleName();
    	$controller = $request->getControllerName();
    	$action     = $request->getActionName();
    	   
    	if(array_key_exists($module, self::$_register) === false) {
    	 self::$_register[$module] = new Arm_Acl(Arm_User::getInstance()->getGroup(), $module);
    	}
    	/*@var $acl Arm_Acl */
    	$acl = self::$_register[$module];
    	
    	    Zend_Registry::set('Arm_Acl', $acl);
    	
    	// создадим обьект модели если есть класс
    	$class = ucfirst($module) . '_Model_Acl';
    	if(is_file(Arm_Core::getPathModule($module) . 'model/Acl.php') and class_exists($class, true)) {
    	// модель запускаеться всегда
    	// все дествия по установке acl данной модели будут сохраненны в текущем acl
    	// модель для одного действия запуститься только единожды!!!
    	// по идеи не должно одно и тоже действия во время одного вызова вызваться дважды!!!
    	$model = new $class($acl->getZendAcl(), $module, $controller, $action);
          if(!$model instanceof Arm_Module_Model_Acl){
    			throw new Arm_Exception(Arm_Translate::_('Класс %s должен наследовать Arm_Module_Model_Acl', $class));
    		}
    	}
    	// Установка acl в навигацию
        Zend_View_Helper_Navigation_HelperAbstract::setDefaultAcl($acl->getZendAcl());
        Zend_View_Helper_Navigation_HelperAbstract::setDefaultRole(Arm_User::getInstance()->getGroup());
    	
    	// проверяем
    	if(false === $acl->isAllowed($request->getControllerName(), $request->getActionName())) {
    		// проверим если пользователь не вошол вернем на страницу входа
    		if(Arm_User::getInstance()->isLogin() === false) {
    		    /*@var $redirector Zend_Controller_Action_Helper_Redirector */
    		    $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
    		    $redirector->gotoUrl('/user/');
    		    $redirector->redirectAndExit();
    		    return;
    		}
    	    throw new Arm_Exception('Не достаточно прав', 403);
    	}
    	
    }

}